//++++++++++++++++++++++++++++++++++++++++
// 《Go Web编程实战派从入门到精通》源码
//++++++++++++++++++++++++++++++++++++++++
// Author:廖显东（ShirDon）
// Blog:https://www.shirdon.com/
// 仓库地址：https://gitee.com/shirdonl/goWebActualCombat
// 仓库地址：https://github.com/shirdonl/goWebActualCombat
//++++++++++++++++++++++++++++++++++++++++

package main

import (
	"fmt"
	"time"

	"github.com/jinzhu/gorm" // gorm v1 [http://v1.gorm.io/]
	_ "github.com/jinzhu/gorm/dialects/mysql"
	// "gorm.io/driver/mysql"
	// "gorm.io/gorm"  // gorm v2 [https://gorm.io/docs/v2_release_note.html]
)

// User2 用户信息
type User2 struct {
	// gorm.Model
	ID        int       `gorm:"->:false;<-:create;primary_key;AUTO_INCREMENT" json:"my_id"`
	Id_string string    `gorm:"Column:id_str;type:varchar(20);primary_key;" json:"my_id_string"`
	Ip        string    `gorm:"type:varchar(20);not null;index:ip_idx" json:"ip"`
	Ua        string    `gorm:"type:varchar(256);not null;" json:"ua"`
	Title     string    `gorm:"type:varchar(128);not null;index:title_idx" json:"title"`
	Hash      uint64    `gorm:"unique_index:hash_idx;" json:"hash"`
	CreatedAt time.Time `gorm:"autoCreateTime" json:"create_time"` // 允许读、创建
}

func main() {
	dsn := "goweb:goweb123@tcp(192.168.9.150:13306)/goweb?" +
		"charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open("mysql", dsn)
	// db, err := gorm.Open(mysql.Open(dsn))
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.LogMode(true)                             // 显示SQL语句
	db.DB().SetMaxIdleConns(5)                   // SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。
	db.DB().SetMaxOpenConns(100)                 // SetMaxOpenConns 设置打开数据库连接的最大数量。
	db.DB().SetConnMaxLifetime(time.Minute * 30) // SetConnMaxLifetime 设置了连接可复用的最大时间。

	// 自动迁移
	db.AutoMigrate(&User2{})

	u1 := &User2{Id_string: "11", Ip: "192.168.9.11", Ua: "中文", Title: "18888888111", Hash: uint64(time.Now().UnixNano()), CreatedAt: time.Now()}
	u2 := User2{Id_string: "22", Ip: "192.168.9.22", Ua: "中文", Title: "18888888222", Hash: uint64(time.Now().UnixNano()), CreatedAt: time.Now()}

	////开启事务
	tx := db.Begin()
	// 创建记录
	tx.Create(u1)
	fmt.Printf("插入ID（%v）：%#v\n", u1.ID%2, u1.ID)

	tx.Rollback()
	tx = db.Begin()

	tx.Create(&u2)
	tx.Commit()
	fmt.Printf("插入ID：%#v\n", u2.ID)
	// 查询
	var uu User2
	db.Find(&uu, "id_str=?", "22")
	fmt.Printf("搜索查询：%#v\n", uu)
}
